package cn.bugstack.springframework.context.annotation;

import cn.bugstack.springframework.beans.factory.config.BeanDefinition;
import cn.bugstack.springframework.stereotype.Component;
import cn.hutool.core.util.ClassUtil;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * 一个组件提供者，它通过扫描指定基础包的类路径来寻找候选组件。
 * 具体做法是先扫描指定包下所有类，然后应用排除和包含过滤器对结果类进行筛选。
 *
 * @description 扫描指定包下的类路径，寻找标注了@Component注解的候选组件。
 * @param basePackage 基础包名，表示要扫描的类路径的起点。
 * @return 返回一个包含所有找到的候选组件的BeanDefinition的集合。
 * @date 2022/3/14
 */
public class ClassPathScanningCandidateComponentProvider {

    /**
     * 在指定的包下查找所有的候选组件。
     *
     * @param basePackage 基础包名。
     * @return 找到的候选组件的BeanDefinition集合。
     */
    public Set<BeanDefinition> findCandidateComponents(String basePackage) {
        // 初始化候选组件集合
        Set<BeanDefinition> candidates = new LinkedHashSet<>();
        // 扫描指定包下所有标注了@Component的类。这里使用的是hutool下的工具类。
        Set<Class<?>> classes = ClassUtil.scanPackageByAnnotation(basePackage, Component.class);
        // 遍历扫描结果，为每个找到的类创建BeanDefinition并加入到候选组件集合中
        for (Class<?> clazz : classes) {
            candidates.add(new BeanDefinition(clazz));
        }
        return candidates;
    }

}

